// 解法1. T extends [] 判断 T 是不是 [] 类型
// type First<T extends any[]> = T extends [] ? never : T[0];
// 知识点. extends 类型条件判断

// 解决2. 判断长度 是不是0。T["length"] 获取长度
// type First<T extends any[]> = T["length"] extends 0 ? never : T[0];
// 知识点. 获取 tuple 的 legnth 属性

// 解决3. 判断第一个元素的类型
// type First<T extends any[]> = T[0] extends T[number] ? T[0] : never;
// 知识点. extend union 类型的规则 获取 tuple 的 union 类型
type FirstTest = [1, 2, 3];

// union 类型
type FirstTestNum = FirstTest[number]; // 1 | 2 | 3 。 如果 FirstTest 是空的话 得到的是 never

// 解法4.
type First<T extends any[]> = T extends [infer F, ...infer R] ? F : never;
// 知识点. infer 的使用 解构法

// const test_first: First<[]> = undefined;
let test_first_2: First<["1"]>;

type A = {
  name: number;
};
interface IB extends A {
  age: string;
}
const test1: IB = {
  name: 1,
  age: "1",
};

type ObjectType = {
  [key: string]: any;
};
const obj: ObjectType = { name: "" };
obj["name"];
obj[0];
const test3: keyof ObjectType = "";

// export {};

// js
const first = (array: any[]) => {
  // 1. 判断是不是 空数据。是空数据 返回 never
  // return array[0];

  // 4. 解构法
  const [f1, ...res] = array;
  return f1 ? f1 : "never";
};
